package com.ash.util;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * @author : Chen Chao
 * @description 日期和时间戳转换工具类
 * @encoding : UTF-8
 * @date : 2021/10/20 10:30
 * @file : Time2DataUtils.java
 * @software : IntelliJ IDEA
 * @since : 1.8
 */
public class TimeAndDataUtils {
    /**
     * 每天结束时间
     */
    public static final String END_TIME = " 23:59:59";
    /**
     * 日期字符串模板1
     */
    public static final String FORMAT_DATE1 = "yyyy-MM-dd HH:mm:ss";
    /**
     * 日期字符串模板2
     */
    public static final String FORMAT_DATE2 = "yyyy-MM-dd";
    /**
     * 日期字符串模板3
     */
    public static final String FORMAT_DATE3 = "yyyy/MM/dd";
    /**
     * 日期字符串模板4
     */
    public static final String FORMAT_DATE4 = "yyyyMMdd";

    /**
     * 秒转毫秒
     *
     * @param seconds 秒
     * @return 毫秒
     * @author chen chao
     */
    public static Long change2Milliseconds(Long seconds) {
        if (seconds == null) {
            return null;
        }
        return seconds * 1000;
    }

    /**
     * 毫秒转秒
     *
     * @param milliseconds 毫秒
     * @return 秒
     * @author chen chao
     */
    public static Long change2Seconds(Long milliseconds) {
        if (milliseconds == null) {
            return null;
        }
        return milliseconds / 1000;
    }

    /**
     * 时间戳转日期字符串，默认yyyy-MM-dd
     *
     * @param stamp   时间戳(精确到毫秒)
     * @param pattern 日期模板
     * @return 转换成的日期
     * @author chen chao
     */
    public static String stamp2DateString(Long stamp, String pattern) {
        if (pattern == null) {
            return new SimpleDateFormat(FORMAT_DATE2).format(new Date(stamp));
        }
        return new SimpleDateFormat(pattern).format(new Date(stamp));
    }

    /**
     * 日期转时间戳(毫秒)，默认"yyyy-MM-dd"形式
     *
     * @param dateStr 日期字符串
     * @param pattern 字符串模板
     * @return 时间戳
     * @author chen chao
     */
    public static long timeToStamp(String dateStr, String pattern) {
        if (pattern == null) {
            pattern = FORMAT_DATE2;
        }
        Date date = new Date();
        try {
            SimpleDateFormat sf = new SimpleDateFormat(pattern);
            /*日期转换为时间戳*/
            date = sf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date.getTime();
    }

    /**
     * 计算某天的剩余秒数
     *
     * @param currentDate currentDate
     * @return 某天的剩余秒数
     * @date
     */
    public static Integer getRemainSecondsOneDay(Date currentDate) {
        LocalDateTime midnight = LocalDateTime.ofInstant(currentDate.toInstant(),
                ZoneId.systemDefault()).plusDays(1).withHour(0).withMinute(0)
                .withSecond(0).withNano(0);
        LocalDateTime currentDateTime = LocalDateTime.ofInstant(currentDate.toInstant(),
                ZoneId.systemDefault());
        long seconds = ChronoUnit.SECONDS.between(currentDateTime, midnight);
        return (int) seconds;
    }
}
